package com.mall.mymall.controller;

import com.mall.mymall.common.Result;
import com.mall.mymall.dao.dto.QueryDto;
import com.mall.mymall.dao.dto.querypage.OrganizationPageRequest;
import com.mall.mymall.dao.entity.Organizations;
import com.mall.mymall.service.OrganizationsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/organizations")
public class OrganizationsController {

    @Autowired
    private OrganizationsService organizationsService;

    /**
     * 处理组织信息的分页查询请求
     * 该方法接收一个OrganizationPageRequest对象作为参数，用于指定查询条件和分页信息
     * 返回一个Result对象，其中包含查询结果，结果为一个QueryDto对象，该对象中包含分页的组织信息
     *
     * @param organizationPageRequest 包含查询条件和分页信息的请求对象
     * @return 包含分页组织信息查询结果的Result对象
     */
    @PostMapping("/pageQuery")
    public Result<QueryDto<Organizations>> pageOrganizations(@RequestBody OrganizationPageRequest organizationPageRequest) {
        return Result.success(organizationsService.pageOrganizations(organizationPageRequest));
    }

    /**
     * 添加机构信息
     *
     * 该方法通过POST请求接收一个Organizations对象，将其保存到数据库中
     * 使用HTTP POST方法是因为它适合于创建新的资源
     *
     * @param organizations 要添加的机构信息，通过请求体(@RequestBody)传递
     * @return 返回一个Result对象，包含添加的机构信息，用于响应客户端请求
     */
    @PostMapping("/add")
    public Result<Organizations> addOrganization(@RequestBody Organizations organizations) {
        try {
            // 调用service层的save方法保存机构信息
            organizationsService.save(organizations);
            // 返回成功结果，包含保存的机构信息
            return Result.success(organizations);
        } catch (Exception e) {
            return Result.fail("保存组织失败");
        }
    }

    /**
     * 更新指定公司的组织信息
     * <p>
     * 该接口通过HTTP PUT请求接收一个包含更新信息的组织对象，并更新对应公司的信息
     * 主要用于在系统中更新一个已存在的组织实体，包括其基本信息和配置
     *
     * @param companyId 公司ID，用于指定需要更新的组织
     * @param organizations 更新后的组织信息对象，包含需要更新的组织的各种属性
     * @return 返回一个Result对象，包含更新后的组织信息，用于告知客户端操作结果
     */
    @PutMapping("/update/{companyId}")
    public Result<Organizations> updateOrganization(@PathVariable("companyId") Long companyId, @RequestBody Organizations organizations) {
        // 调用服务层方法，更新数据库中的组织信息
        organizationsService.updateById(organizations);
        // 返回成功结果，包含更新后的组织信息
        return Result.success(organizations);
    }

    /**
     * 删除指定公司的组织信息
     *
     * @param companyId 公司ID，用于标识要删除的组织
     * @return 返回删除结果，包括删除成功的消息和null数据体
     */
    @DeleteMapping("/delete/{companyId}")
    public Result<Organizations> deleteOrganization(@PathVariable("companyId") Long companyId) {
        organizationsService.removeById(companyId);
        return Result.success(null,"删除成功");
    }


    /**
     * 获取所有组织信息
     *
     * 通过发送GET请求到"/getAll"来调用此方法
     * 此方法无需参数，返回一个包含所有组织信息的列表
     *
     * @return 包含所有组织信息的列表，封装在Result对象中
     */
    @GetMapping("/getAll")
    public Result<List<Organizations>> getAllOrganizations() {
        // 调用Service层的list方法获取所有组织信息的列表
        List<Organizations> list = organizationsService.list();
        // 返回成功结果，包含组织信息列表
        return Result.success(list);
    }

    @GetMapping("/getAllId")
    public Result<List<Integer>> getAllOrganizationIds() {
        // 调用Service层的list方法获取所有组织信息的列表
        List<Organizations> list = organizationsService.list();

        // 提取组织 ID 并转换为整数列表
        List<Integer> organizationIds = list.stream()
                .map(Organizations::getOrganizationId) // 假设 OrganizationId 是整数类型
                .collect(Collectors.toList());

        // 返回成功结果，包含组织 ID 列表
        return Result.success(organizationIds);
    }
}